package com.songtech.base.universal.service;

import java.io.Serializable;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.cursor.Cursor;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.songtech.base.universal.dao.BaseDaoImpl;
import com.songtech.base.universal.dao.beans.Where;
import com.songtech.base.universal.dao.util.ThrowsExceptionUtil;

/**
 * 通用service
 * <br>在controller中通过传入自定义的mybatis配置文件的方法和相应的map可以实现无特殊service处理的增删改查
 * <br>service的注入格式：@Resource(name = "com.songtech.universalservice.model.UniversalTest_service")，
 * <br>com.songtech.universalservice.model.UniversalTest是要注入service处理的entity对象，“_service”用于区分与基础dao注入的bean名字
 * <br>map对象：与自定义的mybatis中的#{}对应
 * <br>传入的方法名：mybatis的命名空间 + “.” + 方法名(namespace + "." + methodName)
 * <br>注意：UniversalService只能在controller中使用
 * @param <T>
 */
@Service
public class BaseServiceImpl<T extends Object> extends BaseDaoImpl<T> implements BaseService<T> {
	/**
	 * 通用service类UniversalService
	 * <br>调用自定义的mybatis添加数据
	 * @param methodName 需要调用的mybatis添加方法
	 * @return 
	 * @throws SQLException 
	 */
	@Override
	public Integer insert(String methodName) throws SQLException {
		return this.insert(methodName, null);
	}
	
	/**
	 * 通用service类UniversalService
	 * <br>调用自定义的mybatis添加数据
	 * @param methodName 需要调用的mybatis添加方法
	 * @param map 参数对象
	 * @return 
	 * @throws SQLException 
	 */
	@Override
	public Integer insert(String methodName, Map<String, ?> map) throws SQLException {
		ThrowsExceptionUtil.throwNullParametersException(methodName);
		return this.getSqlSession().insert(methodName, map);
	}
	
	/**
	 * 通用service类UniversalService
	 * <br>调用自定义的mybatis修改数据
	 * @param methodName 需要调用的mybatis修改方法
	 * @return
	 * @throws SQLException 
	 */
	@Override
	public Integer update(String methodName) throws SQLException {
		return this.update(methodName, null);
	}
	
	/**
	 * 通用service类UniversalService
	 * <br>调用自定义的mybatis修改数据
	 * @param methodName 需要调用的mybatis修改方法
	 * @param map 参数对象，可以传null
	 * @return
	 * @throws SQLException 
	 */
	@Override
	public Integer update(String methodName, Map<String, ?> map) throws SQLException {
		ThrowsExceptionUtil.throwNullParametersException(methodName);
		return this.getSqlSession().update(methodName, map);
	}
	
	/**
	 * 通用service类UniversalService
	 * <br>调用自定义的mybatis删除数据
	 * @param methodName 需要调用的mybatis删除方法
	 * @return
	 * @throws SQLException 
	 */
	@Override
	public Integer delete(String methodName) throws SQLException {
		return this.delete(methodName, null);
	}
	
	/**
	 * 通用service类UniversalService
	 * <br>调用自定义的mybatis删除数据
	 * @param methodName 需要调用的mybatis删除方法
	 * @param map 参数对象
	 * @return
	 * @throws SQLException 
	 */
	@Override
	public Integer delete(String methodName, Map<String, ?> map) throws SQLException {
		ThrowsExceptionUtil.throwNullParametersException(methodName);
		return this.getSqlSession().delete(methodName, map);
	}
	
	/**
	 * 通用service类UniversalService
	 * <br>调用自定义的mybatis查询一条数据
	 * @param methodName 需要调用的mybatis查询方法
	 * @return
	 * @throws SQLException 
	 */
	@Override
	public Object selectOne(String methodName) throws SQLException {
		return this.selectOne(methodName, null);
	}
	
	/**
	 * 通用service类UniversalService
	 * <br>调用自定义的mybatis查询一条数据
	 * @param methodName 需要调用的mybatis查询方法
	 * @param map 参数对象
	 * @return
	 * @throws SQLException 
	 */
	@Override
	public Object selectOne(String methodName, Map<String, ?> map) throws SQLException {
		ThrowsExceptionUtil.throwNullParametersException(methodName);
		return this.getSqlSession().selectOne(methodName, map);
	}
	
	/**
	 * 通用service类UniversalService
	 * <br>调用自定义的mybatis查询一条数据
	 * <br>使用redis缓存
	 * @param methodName 需要调用的mybatis查询方法
	 * @return
	 * @throws SQLException 
	 */
	@Override
	@Cacheable(value = "selectOneUseRedis")
	public Object selectOneUseRedis(String methodName) throws SQLException {
		return this.selectOne(methodName, null);
	}
	
	/**
	 * 通用service类UniversalService
	 * <br>调用自定义的mybatis查询一条数据
	 * <br>使用redis缓存
	 * @param methodName 需要调用的mybatis查询方法
	 * @param map 参数对象
	 * @return
	 * @throws SQLException 
	 */
	@Override
	@Cacheable(value = "selectOneUseRedis")
	public Object selectOneUseRedis(String methodName, Map<String, ?> map) throws SQLException {
		return this.selectOne(methodName, map);
	}
	
	/**
	 * 通用service类UniversalService
	 * <br>调用自定义的mybatis查询数据
	 * @param methodName 需要调用的mybatis查询方法
	 * @return
	 * @throws SQLException 
	 */
	@Override
	public List<?> selectList(String methodName) throws SQLException {
		PageInfo<?> pageInfo = this.selectList(methodName, null, null);
		return pageInfo.getList();
	}
	
	/**
	 * 通用service类UniversalService
	 * <br>调用自定义的mybatis查询数据
	 * @param methodName 需要调用的mybatis查询方法
	 * @param map 参数对象
	 * @return
	 * @throws SQLException 
	 */
	@Override
	public List<?> selectList(String methodName, Map<String, ?> map) throws SQLException {
		PageInfo<?> pageInfo = this.selectList(methodName, map, null);
		return pageInfo.getList();
	}
	
	/**
	 * 通用service类UniversalService
	 * <br>调用自定义的mybatis查询数据
	 * @param methodName 需要调用的mybatis查询方法
	 * @param page 分页标签，可以传null
	 * @return
	 * @throws SQLException 
	 */
	@Override
	public PageInfo<?> selectList(String methodName, Page<?> page) throws SQLException {
		return this.selectList(methodName, null, page);
	}
	
	/**
	 * 通用service类UniversalService
	 * <br>调用自定义的mybatis查询数据
	 * @param methodName 需要调用的mybatis查询方法
	 * @param map 参数对象
	 * @param page 分页标签，可以传null
	 * @return
	 * @throws SQLException 
	 */
	@Override
	public PageInfo<?> selectList(String methodName, Map<String, ?> map, Page<?> page) throws SQLException {
		ThrowsExceptionUtil.throwNullParametersException(methodName);
		if(page != null && page.getPageNum() > 0 && page.getPageSize() > 0){
			PageHelper.startPage(page.getPageNum(), page.getPageSize());
		}
		
		List<?> list = this.getSqlSession().selectList(methodName, map);
		return new PageInfo<>(list);
	}
	
	/**
	 * 通用service类UniversalService
	 * <br>调用自定义的mybatis查询数据
	 * <br>使用redis缓存
	 * @param methodName 需要调用的mybatis查询方法
	 * @return
	 * @throws SQLException 
	 */
	@Override
	@Cacheable(value = "selectListUseRedis")
	public List<?> selectListUseRedis(String methodName) throws SQLException {
		PageInfo<?> pageInfo = this.selectList(methodName, null, null);
		return pageInfo.getList();
	}
	
	/**
	 * 通用service类UniversalService
	 * <br>调用自定义的mybatis查询数据
	 * <br>使用redis缓存
	 * @param methodName 需要调用的mybatis查询方法
	 * @param map 参数对象
	 * @return
	 * @throws SQLException 
	 */
	@Override
	@Cacheable(value = "selectListUseRedis")
	public List<?> selectListUseRedis(String methodName, Map<String, ?> map) throws SQLException {
		PageInfo<?> pageInfo = this.selectList(methodName, map, null);
		return pageInfo.getList();
	}
	
	/**
	 * 通用service类UniversalService
	 * <br>调用自定义的mybatis查询数据
	 * <br>使用redis缓存
	 * @param methodName 需要调用的mybatis查询方法
	 * @param page 分页标签，可以传null
	 * @return
	 * @throws SQLException 
	 */
	@Override
	@Cacheable(value = "selectListUseRedis")
	public PageInfo<?> selectListUseRedis(String methodName, Page<?> page) throws SQLException {
		return this.selectList(methodName, null, page);
	}
	
	/**
	 * 通用service类UniversalService
	 * <br>调用自定义的mybatis查询数据
	 * <br>使用redis缓存
	 * @param methodName 需要调用的mybatis查询方法
	 * @param map 参数对象
	 * @param page 分页标签，可以传null
	 * @return
	 * @throws SQLException 
	 */
	@Override
	@Cacheable(value = "selectListUseRedis")
	public PageInfo<?> selectListUseRedis(String methodName, Map<String, ?> map, Page<?> page) throws SQLException {
		return this.selectList(methodName, map, page);
	}
	
	/**
	 * 通用service类UniversalService
	 * <br>调用自定义的mybatis查询数据
	 * @param methodName 需要调用的mybatis查询方法
	 * @param key 每一个查询到的对象保存到map中的key值，对于保存到map中的key的值等于该条数据指定key对应的字段的值
	 * <br>1、mybatis的mapper指定的返回类型为resultMap，key值为resultMap指定的result标签中的property的值(绑定实体的属性名称)
	 * <br>如：<result column="name_test" property="name" jdbcType="VARCHAR" />指定的property="name"，传入的key值应传入“name”
	 * <br>返回类型为resultMap，key=指定的实体属性的名字
	 * <br>2、mybatis的mapper指定的返回类型为resultType，key值为数据表对应的字段名
	 * <br>返回类型为resultType，key=数据表对应的字段名
	 * @return map将转为List后返回
	 * <br>mybatis的mapper指定的返回类型为resultMap时，返回的是mapper指定的类的list集合
	 * <br>mybatis的mapper指定的返回类型为resultType时，返回的是多个map(key=表的字段，value=字段对应的值)组成的list集合
	 * @throws SQLException 
	 */
	@Override
	public List<?> selectMap(String methodName, String key) throws SQLException {
		PageInfo<?> pageInfo = this.selectMap(methodName, null, key, null);
		return pageInfo.getList();
	}
	
	/**
	 * 通用service类UniversalService
	 * <br>调用自定义的mybatis查询数据
	 * @param methodName 需要调用的mybatis查询方法
	 * @param map 参数对象
	 * @param key 每一个查询到的对象保存到map中的key值，对于保存到map中的key的值等于该条数据指定key对应的字段的值
	 * <br>1、mybatis的mapper指定的返回类型为resultMap，key值为resultMap指定的result标签中的property的值(绑定实体的属性名称)
	 * <br>如：<result column="name_test" property="name" jdbcType="VARCHAR" />指定的property="name"，传入的key值应传入“name”
	 * <br>返回类型为resultMap，key=指定的实体属性的名字
	 * <br>2、mybatis的mapper指定的返回类型为resultType，key值为数据表对应的字段名
	 * <br>返回类型为resultType，key=数据表对应的字段名
	 * @return map将转为List后返回
	 * <br>mybatis的mapper指定的返回类型为resultMap时，返回的是mapper指定的类的list集合
	 * <br>mybatis的mapper指定的返回类型为resultType时，返回的是多个map(key=表的字段，value=字段对应的值)组成的list集合
	 * @throws SQLException 
	 */
	@Override
	public List<?> selectMap(String methodName, Map<String, ?> map, String key) throws SQLException {
		PageInfo<?> pageInfo = this.selectMap(methodName, map, key, null);
		return pageInfo.getList();
	}
	
	/**
	 * 通用service类UniversalService
	 * <br>调用自定义的mybatis查询数据
	 * @param methodName 需要调用的mybatis查询方法
	 * @param key 每一个查询到的对象保存到map中的key值，对于保存到map中的key的值等于该条数据指定key对应的字段的值
	 * <br>1、mybatis的mapper指定的返回类型为resultMap，key值为resultMap指定的result标签中的property的值(绑定实体的属性名称)
	 * <br>如：<result column="name_test" property="name" jdbcType="VARCHAR" />指定的property="name"，传入的key值应传入“name”
	 * <br>返回类型为resultMap，key=指定的实体属性的名字
	 * <br>2、mybatis的mapper指定的返回类型为resultType，key值为数据表对应的字段名
	 * <br>返回类型为resultType，key=数据表对应的字段名
	 * @param page 分页标签，可以传null
	 * @return map将转为List后组装为PageInfo对象返回
	 * <br>mybatis的mapper指定的返回类型为resultMap时，返回的是mapper指定的类的list集合组装的PageInfo对象
	 * <br>mybatis的mapper指定的返回类型为resultType时，返回的是多个map(key=表的字段，value=字段对应的值)组成的list集合的PageInfo对象
	 * @throws SQLException 
	 */
	@Override
	public PageInfo<?> selectMap(String methodName, String key, Page<?> page) throws SQLException {
		return this.selectMap(methodName, null, key, page);
	}
	
	/**
	 * 通用service类UniversalService
	 * <br>调用自定义的mybatis查询数据
	 * @param methodName 需要调用的mybatis查询方法
	 * @param map 参数对象
	 * @param key 每一个查询到的对象保存到map中的key值，对于保存到map中的key的值等于该条数据指定key对应的字段的值
	 * <br>1、mybatis的mapper指定的返回类型为resultMap，key值为resultMap指定的result标签中的property的值(绑定实体的属性名称)
	 * <br>如：<result column="name_test" property="name" jdbcType="VARCHAR" />指定的property="name"，传入的key值应传入“name”
	 * <br>返回类型为resultMap，key=指定的实体属性的名字
	 * <br>2、mybatis的mapper指定的返回类型为resultType，key值为数据表对应的字段名
	 * <br>返回类型为resultType，key=数据表对应的字段名
	 * @param page 分页标签，可以传null
	 * @return map将转为List后组装为PageInfo对象返回
	 * <br>mybatis的mapper指定的返回类型为resultMap时，返回的是mapper指定的类的list集合组装的PageInfo对象
	 * <br>mybatis的mapper指定的返回类型为resultType时，返回的是多个map(key=表的字段，value=字段对应的值)组成的list集合的PageInfo对象
	 * @throws SQLException 
	 */
	@Override
	public PageInfo<?> selectMap(String methodName, Map<String, ?> map, String key, Page<?> page) throws SQLException {
		ThrowsExceptionUtil.throwNullParametersException(methodName, key);
		if(page != null){
			PageHelper.startPage(page.getPageNum(), page.getPageSize());
		}
		Map<?, ?> maps = this.getSqlSession().selectMap(methodName, map, key);
		
		// map转换为list
		List<Object> list = new ArrayList<>();
		for(Map.Entry<?, ?> entry : maps.entrySet()){
			list.add(entry.getValue());
		}
		
		return new PageInfo<>(list);
	}
	
	/**
	 * 通用service类UniversalService
	 * <br>调用自定义的mybatis查询数据
	 * <br>使用redis缓存
	 * @param methodName 需要调用的mybatis查询方法
	 * @param key 每一个查询到的对象保存到map中的key值，对于保存到map中的key的值等于该条数据指定key对应的字段的值
	 * <br>1、mybatis的mapper指定的返回类型为resultMap，key值为resultMap指定的result标签中的property的值(绑定实体的属性名称)
	 * <br>如：<result column="name_test" property="name" jdbcType="VARCHAR" />指定的property="name"，传入的key值应传入“name”
	 * <br>返回类型为resultMap，key=指定的实体属性的名字
	 * <br>2、mybatis的mapper指定的返回类型为resultType，key值为数据表对应的字段名
	 * <br>返回类型为resultType，key=数据表对应的字段名
	 * @return map将转为List后返回
	 * <br>mybatis的mapper指定的返回类型为resultMap时，返回的是mapper指定的类的list集合
	 * <br>mybatis的mapper指定的返回类型为resultType时，返回的是多个map(key=表的字段，value=字段对应的值)组成的list集合
	 * @throws SQLException 
	 */
	@Override
	@Cacheable(value = "selectMapUseRedis")
	public List<?> selectMapUseRedis(String methodName, String key) throws SQLException {
		PageInfo<?> pageInfo = this.selectMap(methodName, null, key, null);
		return pageInfo.getList();
	}
	
	/**
	 * 通用service类UniversalService
	 * <br>调用自定义的mybatis查询数据
	 * <br>使用redis缓存
	 * @param methodName 需要调用的mybatis查询方法
	 * @param map 参数对象
	 * @param key 每一个查询到的对象保存到map中的key值，对于保存到map中的key的值等于该条数据指定key对应的字段的值
	 * <br>1、mybatis的mapper指定的返回类型为resultMap，key值为resultMap指定的result标签中的property的值(绑定实体的属性名称)
	 * <br>如：<result column="name_test" property="name" jdbcType="VARCHAR" />指定的property="name"，传入的key值应传入“name”
	 * <br>返回类型为resultMap，key=指定的实体属性的名字
	 * <br>2、mybatis的mapper指定的返回类型为resultType，key值为数据表对应的字段名
	 * <br>返回类型为resultType，key=数据表对应的字段名
	 * @return map将转为List后返回
	 * <br>mybatis的mapper指定的返回类型为resultMap时，返回的是mapper指定的类的list集合
	 * <br>mybatis的mapper指定的返回类型为resultType时，返回的是多个map(key=表的字段，value=字段对应的值)组成的list集合
	 * @throws SQLException 
	 */
	@Override
	@Cacheable(value = "selectMapUseRedis")
	public List<?> selectMapUseRedis(String methodName, Map<String, ?> map, String key) throws SQLException {
		PageInfo<?> pageInfo = this.selectMap(methodName, map, key, null);
		return pageInfo.getList();
	}
	
	/**
	 * 通用service类UniversalService
	 * <br>调用自定义的mybatis查询数据
	 * <br>使用redis缓存
	 * @param methodName 需要调用的mybatis查询方法
	 * @param key 每一个查询到的对象保存到map中的key值，对于保存到map中的key的值等于该条数据指定key对应的字段的值
	 * <br>1、mybatis的mapper指定的返回类型为resultMap，key值为resultMap指定的result标签中的property的值(绑定实体的属性名称)
	 * <br>如：<result column="name_test" property="name" jdbcType="VARCHAR" />指定的property="name"，传入的key值应传入“name”
	 * <br>返回类型为resultMap，key=指定的实体属性的名字
	 * <br>2、mybatis的mapper指定的返回类型为resultType，key值为数据表对应的字段名
	 * <br>返回类型为resultType，key=数据表对应的字段名
	 * @param page 分页标签，可以传null
	 * @return map将转为List后组装为PageInfo对象返回
	 * <br>mybatis的mapper指定的返回类型为resultMap时，返回的是mapper指定的类的list集合组装的PageInfo对象
	 * <br>mybatis的mapper指定的返回类型为resultType时，返回的是多个map(key=表的字段，value=字段对应的值)组成的list集合的PageInfo对象
	 * @throws SQLException 
	 */
	@Override
	@Cacheable(value = "selectMapUseRedis")
	public PageInfo<?> selectMapUseRedis(String methodName, String key, Page<?> page) throws SQLException {
		return this.selectMap(methodName, null, key, page);
	}
	
	/**
	 * 通用service类UniversalService
	 * <br>调用自定义的mybatis查询数据
	 * <br>使用redis缓存
	 * @param methodName 需要调用的mybatis查询方法
	 * @param map 参数对象
	 * @param key 每一个查询到的对象保存到map中的key值，对于保存到map中的key的值等于该条数据指定key对应的字段的值
	 * <br>1、mybatis的mapper指定的返回类型为resultMap，key值为resultMap指定的result标签中的property的值(绑定实体的属性名称)
	 * <br>如：<result column="name_test" property="name" jdbcType="VARCHAR" />指定的property="name"，传入的key值应传入“name”
	 * <br>返回类型为resultMap，key=指定的实体属性的名字
	 * <br>2、mybatis的mapper指定的返回类型为resultType，key值为数据表对应的字段名
	 * <br>返回类型为resultType，key=数据表对应的字段名
	 * @param page 分页标签，可以传null
	 * @return map将转为List后组装为PageInfo对象返回
	 * <br>mybatis的mapper指定的返回类型为resultMap时，返回的是mapper指定的类的list集合组装的PageInfo对象
	 * <br>mybatis的mapper指定的返回类型为resultType时，返回的是多个map(key=表的字段，value=字段对应的值)组成的list集合的PageInfo对象
	 * @throws SQLException 
	 */
	@Override
	@Cacheable(value = "selectMapUseRedis")
	public PageInfo<?> selectMapUseRedis(String methodName, Map<String, ?> map, String key, Page<?> page) throws SQLException {
		return this.selectMap(methodName, map, key, page);
	}
	
	/**
	 * 通用service类UniversalService
	 * <br>大数据游标查询
	 * <br>查询存在异常，暂不使用
	 * @param methodName 需要调用的mybatis查询方法
	 * @return
	 * @throws SQLException 
	 */
	@Override
	public Cursor<?> selectCursor(String methodName) throws SQLException {
		return this.selectCursor(methodName, null);
	}
	
	/**
	 * 通用service类UniversalService
	 * <br>大数据游标查询
	 * <br>查询存在异常，暂不使用
	 * @param methodName 需要调用的mybatis查询方法
	 * @param map 参数对象
	 * @return
	 * @throws SQLException 
	 */
	@Override
	public Cursor<?> selectCursor(String methodName, Map<String, ?> map) throws SQLException {
		ThrowsExceptionUtil.throwNullParametersException(methodName);
		return this.getSqlSession().selectCursor(methodName, map);
	}
	
	/**
	 * 通用service类UniversalService
	 * <br>大数据游标查询
	 * <br>使用redis缓存
	 * <br>查询存在异常，暂不使用
	 * @param methodName 需要调用的mybatis查询方法
	 * @return
	 * @throws SQLException 
	 */
	@Override
	@Cacheable(value = "selectCursorUseRedis")
	public Cursor<?> selectCursorUseRedis(String methodName) throws SQLException {
		return this.selectCursor(methodName, null);
	}
	
	/**
	 * 通用service类UniversalService
	 * <br>大数据游标查询
	 * <br>使用redis缓存
	 * <br>查询存在异常，暂不使用
	 * @param methodName 需要调用的mybatis查询方法
	 * @param map 参数对象
	 * @return
	 * @throws SQLException 
	 */
	@Override
	@Cacheable(value = "selectCursorUseRedis")
	public Cursor<?> selectCursorUseRedis(String methodName, Map<String, ?> map) throws SQLException {
		return this.selectCursor(methodName, map);
	}
	
	/**
	 * 通用service类UniversalService
	 * <br>分页查询
	 * <br>调用BaseDao中的查询方法
	 * @param obj
	 * @param page 分页标签，可以传null
	 * @return
	 * @throws SQLException
	 */
	@Override
	public PageInfo<T> select(T obj, Page<?> page) throws SQLException {
		ThrowsExceptionUtil.throwNullParametersException(obj, page);
		if(page != null && page.getPageNum() > 0 && page.getPageSize() > 0){
			PageHelper.startPage(page.getPageNum(), page.getPageSize());
		}
		List<T> list = this.select(obj);
		return new PageInfo<>(list);
	}
	
	/**
	 * 通用service类UniversalService
	 * <br>分页查询
	 * <br>调用BaseDao中的查询方法
	 * <br>使用redis缓存
	 * @param obj
	 * @param page 分页标签，可以传null
	 * @return
	 * @throws SQLException
	 */
	@Override
	@Cacheable(value = "selectUseRedis")
	public PageInfo<T> selectUseRedis(T obj, Page<?> page) throws SQLException {
		return this.select(obj, page);
	}
	
	/**
	 * 通用service类UniversalService
	 * <br>条件查询
	 * <br>调用BaseDao中的查询方法
	 * <br>使用redis缓存
	 * @param obj
	 * @return
	 * @throws SQLException
	 */
	@Override
	@Cacheable(value = "selectUseRedis")
	public List<T> selectUseRedis(T obj) throws SQLException {
		return this.select(obj);
	}
	
	/**
	 * 通用service类UniversalService
	 * <br>条件查询
	 * <br>调用BaseDao中的查询方法
	 * <br>使用redis缓存
	 * @param where
	 * @return
	 * @throws SQLException
	 */
	@Override
	@Cacheable(value = "selectUseRedis")
	public List<T> selectUseRedis(Where where) throws SQLException {
		return this.select(where);
	}
	
	/**
	 * 通用service类UniversalService
	 * <br>通过主键获取记录
	 * <br>调用BaseDao中的查询方法
	 * <br>使用redis缓存
	 * @param id 主键
	 * @return Object
	 * @throws SQLException 
	 */
	@Override
	@Cacheable(value = "selectByIdUseRedis")
	public T selectByIdUseRedis(Serializable id) throws SQLException {
		return super.selectById(id);
	}
}
